package com.wangbo.semaphore;

import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

/**
 * 信号量限流
 */
public class Client {

    public static void main(String[] args) {
        // 定义信号量，包含两张许可
        Semaphore semaphore = new Semaphore(2);
        // 定义固定线程池
        ExecutorService threadPool = Executors.newFixedThreadPool(5);

        // 定义任务
        Runnable task = new Runnable() {
            @Override
            public void run() {
                // 获取当前线程名称
                String tName = Thread.currentThread().getName();
                System.out.printf("老司机：%s, 停车场外排队，时间：%tF %<tT%n", tName, new Date());

                try {
                    // 获取许可，拿不到阻塞
                    semaphore.acquire();

                    System.out.printf("老司机：%s, 进入停车场，时间：%tF %<tT%n", tName, new Date());
                    Thread.sleep(3000);
                    System.out.printf("老司机：%s, 离开停车场，时间：%tF %<tT%n", tName, new Date());

                    // 释放许可
                    semaphore.release();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        // 执行任务，这里一个线程领一个任务
        threadPool.submit(task);
        threadPool.submit(task);
        threadPool.submit(task);
        threadPool.submit(task);
        threadPool.submit(task);

        // 线程池不再接受新任务，等任务执行完毕，关闭线程池。
        threadPool.shutdown();
    }
}
